著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
什么是 Chrome 插件
众所周知,在 Chrome 的多进程架构中,包含这样几种进程:
浏览器主进程。
整个浏览器的主要进程,其他几个进程都是这个进程的子进程,由它来管理和调配;同时你所看到的浏览器的整个窗口,包含地址输入栏,书签栏这些东西也都是它来展示的;
渲染进程。
一般来说一个 Tab 标签页面就是一个渲染进程;每个渲染进程中会运行 Blink 布局引擎,V8 JavaScript 执行引擎等,单独服务于一个 Tab 标签页;运行在沙盒中无法访问系统资源。
插件进程。
一个插件单独存在于一个进程当中,同时为了安全性,运行在沙盒中限制其权限。
网络进程。
发起网络请求访问。
GPU 进程。
处理 GPU 渲染方面的任务。
Chrome 插件就是运行在 Chrome 浏览器中的拓展程序,所属浏览器插件进程。类似 Electron 是运用 Web 技术加 Electron 提供给我们的 API 开发,Chrome 插件其实就是运用 Web 技术和 Chrome 的 API 开发的能增强 Chrome 功能的 web 软件而已。Chrome Extension API 中已经列出了我们所有能用到的 API,Chrome 插件可以做到但不限于以下功能:
- 网络请求控制
- 自定义右键
- 网页中插入 CSS 、JavaScript 文件
- 管理书签
- 管理 cookie
- omnibox 管理
- …
基本概念
基本组成
开发一个 Chrome 插件最常用最基本组成包括:
- manifest.json
- background script
- content script
- popup
manifest.json
1 | { |
background script
background 可以理解为是一个常驻 Chrome 后台的页面,只要浏览器打开它就存在,Chrome 关闭它才关闭,一般把需要一直运行的全局的代码都放在 background 里。
content script
在 Chrome 插件中使用 Content Scripts 有以下两种方式:
在 manifest.json 文件中声明 Content Scripts
1
2
3
4
5
6
7
8
9
10
11
12
13{
"version": "0.0.1",
"name": "welearnmore-content_scripts",
"manifest_version": 2,
"description": "welearnmore",
"content_scripts": [
{
"matches": ["https://icepy.me/*"],
"js": ["content_scripts.js"]
}
],
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self';"
}动态注入 Content Scripts
利用
chrome.tabs.executeScript
向页面动态注入一段 Content Scripts 。1
2
3
4
5chrome.runtime.onMessage.addListener(function(request, sender, sendResponse){
chrome.tabs.create({ url: 'https://icepy.me'}, function(tab){
chrome.tabs.executeScript(tab.id, {file: 'dynamic_content_scripts.js'});
});
})
popup
Popup 就是一个普通的HTML文件,它可以包含任何内容,比如:HTML
,CSS
,JavaScript
,与普通网页唯一的区别是,它显示在浏览器的右上角。
如果要开启 Popup 需在 manifest.json 文件中 配置入口文件 :
1 | { |
通信机制
content script => background
1 | // 在 content-script 端发送消息 |
background => content script
一个插件里只有一个 background 环境,而 content-script 可以有多个(一个页面一个)。
1 | /** |
popup => background
popup 与 background 通信,可以使用chrome.runtime.sendMessage
和chrome.runtime.onMessage
1 | // background.js 中,利用消息通信的机制,去打开一个tab,由 Popup 页面中的某个按钮来触发 |
在 popup 中也可以直接调用 background 里的方法:
1 | var bg = chrome.extension.getBackgroundPage(); |
DNS 缓存清除插件开发
目录结构
1 | ./ |
代码实现
manifest.json
1 | { |
popup
1 | const CLEAR_DNS = 'clear dns'; |
background
1 | const CLEAR_DNS = 'clear dns'; |
安装
调试
加载完成后,可以看到 背景页,点击打开,就看到我们熟悉的调控台了。